﻿using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLL
{
    public class Evento_BLL
    {
        #region singleton
        private static Evento_BLL instance;

        private Evento_BLL() { }

        public static Evento_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Evento_BLL();
                }
                return instance;
            }
        }
        #endregion

        public List<hrp_tipo_eventos> ObterTiposEventos()
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_tipo_eventos.Where(e => e.estado == true).GroupBy(e=>e.id).Select(e=>e.FirstOrDefault()).ToList();
        }

        public List<hrp_tipo_eventos> ObterTiposEventosGerais()
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_tipo_eventos.Where(e => e.estado == true && e.requer_funcionario == false).GroupBy(e => e.id).Select(e => e.FirstOrDefault()).ToList();
        }

        public hrp_tipo_eventos ObterTipoEvento(int id)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_tipo_eventos.FirstOrDefault(e => e.id == id);
        }

        public hrp_eventos_detalhe ObterEvento(int idEvento)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_eventos_detalhe.Where(e => e.id == idEvento).FirstOrDefault();
        }

        public List<hrp_eventos_detalhe> ObterEventosEmpresa(int idEmpresa, int tipoEvento)
        {
            hrpEntities hrp = new hrpEntities();
            if (tipoEvento == 0)
                return hrp.hrp_eventos_detalhe.Where(e => e.id_empresa == idEmpresa && e.estado == true).ToList();
            else
                return hrp.hrp_eventos_detalhe.Where(e => e.id_empresa == idEmpresa && e.tipo_evento == tipoEvento && e.estado == true).ToList();
        }

        public List<hrp_eventos_detalhe> ObterEventosEmpresaDataSuperiorNow(int idEmpresa, int tipoEvento)
        {
            hrpEntities hrp = new hrpEntities();
            if (tipoEvento == 0)
                return hrp.hrp_eventos_detalhe.Where(e => e.id_empresa == idEmpresa && e.estado == true && e.data_inicio > DateTime.Now).ToList();
            else
                return hrp.hrp_eventos_detalhe.Where(e => e.id_empresa == idEmpresa && e.tipo_evento == tipoEvento && e.estado == true && e.data_inicio>=DateTime.Now).ToList();
        }

        public List<hrp_eventos_detalhe> ObterEventosFuncionario(int idFuncionario, int tipoEvento)
        {
            hrpEntities hrp = new hrpEntities();
            if (tipoEvento == 0)
                return hrp.hrp_eventos_detalhe.Where(e => e.id_funcionario == idFuncionario && e.estado == true).ToList();
            else
                return hrp.hrp_eventos_detalhe.Where(e => e.id_funcionario == idFuncionario && e.tipo_evento == tipoEvento && e.estado == true).ToList();
        }

        public void AdicionarNovoEvento(string titulo, DateTime dataInicio, DateTime dataFim, int id_tipo_evento,
            string userId, DateTime userTimestamp, string userIp, bool todoDia, int idCliente, int idEmpresa, int idFuncionario,
            string observacao)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_eventos novoEvento = new hrp_eventos();
            PreencherEvento(ref novoEvento, titulo, dataInicio, dataFim, id_tipo_evento, userId, userTimestamp, userIp, todoDia, idCliente, idEmpresa, idFuncionario, observacao);
            hrp.hrp_eventos.Add(novoEvento);
            hrp.SaveChanges();
        }

        private void PreencherEvento(ref hrp_eventos evento, string titulo, DateTime dataInicio, DateTime dataFim, int id_tipo_evento,
            string userId, DateTime userTimestamp, string userIp, bool todoDia, int idCliente, int idEmpresa, int idFuncionario,
            string observacao)
        {
            evento.data_fim = dataFim;
            evento.data_inicio = dataInicio;
            evento.estado = true;
            evento.id_cliente = idCliente;
            evento.id_empresa = idEmpresa;
            evento.id_funcionario = idFuncionario;
            evento.observacao = observacao;
            evento.tipo_evento = id_tipo_evento;
            evento.titulo = titulo;
            evento.todo_dia = todoDia;
            evento.user_id = userId;
            evento.user_ip = userIp;
            evento.user_timestamp = userTimestamp;
        }

        private void CriarLog(hrpEntities hrp, ref hrp_eventos evento, string userId, string userIp, DateTime userTimestamp)
        {
            hrp_eventos_log antigoEvento = new hrp_eventos_log();
            antigoEvento.data_fim = evento.data_fim;
            antigoEvento.data_inicio = evento.data_inicio;
            antigoEvento.estado = evento.estado;
            antigoEvento.id_cliente = evento.id_cliente;
            antigoEvento.id_empresa = evento.id_empresa;
            antigoEvento.id_funcionario = evento.id_funcionario;
            antigoEvento.observacao = evento.observacao;
            antigoEvento.tipo_evento = evento.tipo_evento;
            antigoEvento.titulo = evento.titulo;
            antigoEvento.todo_dia = evento.todo_dia;
            antigoEvento.user_id = evento.user_id;
            antigoEvento.user_ip = evento.user_ip;
            antigoEvento.user_timestamp = evento.user_timestamp;
            antigoEvento.id_evento = evento.id;
            antigoEvento.log_user_id = userId;
            antigoEvento.log_user_ip = userIp;
            antigoEvento.log_user_timestamp = userTimestamp;
            hrp.hrp_eventos_log.Add(antigoEvento);
        }

        public void ApagarEvento(int eventoId, string userId, string userIp, DateTime userTimestamp)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_eventos evento = hrp.hrp_eventos.Where(e => e.id == eventoId).FirstOrDefault();
            CriarLog(hrp, ref evento, userId, userIp, userTimestamp);
            evento.estado = false;
            evento.user_id = userId;
            evento.user_ip = userIp;
            evento.user_timestamp = userTimestamp;
            hrp.SaveChanges();

        }

        public void AlterarEvento(int eventoId, string titulo, DateTime dataInicio, DateTime dataFim, int id_tipo_evento,
        string userId, DateTime userTimestamp, string userIp, bool todoDia, int idCliente, int idEmpresa, int idFuncionario,
        string observacao)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_eventos evento = hrp.hrp_eventos.Where(e => e.id == eventoId).FirstOrDefault();
            CriarLog(hrp, ref evento, userId, userIp, userTimestamp);
            PreencherEvento(ref evento, titulo, dataInicio, dataFim, id_tipo_evento, userId, userTimestamp, userIp, todoDia, idCliente, idEmpresa, idFuncionario, observacao);
            hrp.SaveChanges();
        }
    }
}
